package com.styletransfer.mapper;

import com.styletransfer.model.Like;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 点赞Mapper接口
 *
 * 这个接口定义了与点赞表相关的数据库操作方法。
 * 点赞表记录了用户对风格、组合或作品的点赞关系。
 */
@Mapper
public interface LikeMapper {

    /**
     * 根据ID查询点赞
     *
     * @param id 点赞ID
     * @return 点赞对象
     */
    @Select("SELECT * FROM user_like WHERE id = #{id}")
    Like findById(Long id);

    /**
     * 查询用户的点赞
     *
     * @param userId 用户ID
     * @param type 点赞类型（1:风格, 2:组合, 3:作品）
     * @return 点赞列表
     */
    @Select("SELECT * FROM user_like WHERE userId = #{userId} AND type = #{type} ORDER BY id DESC")
    List<Like> findByUser(@Param("userId") Long userId, @Param("type") Integer type);

    /**
     * 查询用户是否已点赞
     *
     * @param userId 用户ID
     * @param targetId 目标ID
     * @param type 点赞类型（1:风格, 2:组合, 3:作品）
     * @return 点赞对象，如果不存在则返回null
     */
    @Select("SELECT * FROM user_like WHERE userId = #{userId} AND targetId = #{targetId} AND type = #{type}")
    Like findByUserAndTarget(@Param("userId") Long userId, @Param("targetId") Long targetId, @Param("type") Integer type);

    /**
     * 插入点赞
     *
     * @param like 点赞对象
     * @return 影响的行数
     */
    @Insert("INSERT INTO user_like(userId, targetId, type, createTime) " +
            "VALUES(#{userId}, #{targetId}, #{type}, #{createTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Like like);

    /**
     * 删除点赞
     *
     * @param id 点赞ID
     * @return 影响的行数
     */
    @Delete("DELETE FROM user_like WHERE id = #{id}")
    int delete(Long id);

    /**
     * 删除用户的点赞
     *
     * @param userId 用户ID
     * @param targetId 目标ID
     * @param type 点赞类型（1:风格, 2:组合, 3:作品）
     * @return 影响的行数
     */
    @Delete("DELETE FROM user_like WHERE userId = #{userId} AND targetId = #{targetId} AND type = #{type}")
    int deleteByUserAndTarget(@Param("userId") Long userId, @Param("targetId") Long targetId, @Param("type") Integer type);

    /**
     * 统计目标的点赞数
     *
     * @param targetId 目标ID
     * @param type 点赞类型（1:风格, 2:组合, 3:作品）
     * @return 点赞数
     */
    @Select("SELECT COUNT(*) FROM user_like WHERE targetId = #{targetId} AND type = #{type}")
    Integer countByTarget(@Param("targetId") Long targetId, @Param("type") Integer type);

    /**
     * 统计用户的点赞数
     *
     * @param userId 用户ID
     * @param type 点赞类型（1:风格, 2:组合, 3:作品）
     * @return 点赞数
     */
    @Select("SELECT COUNT(*) FROM user_like WHERE userId = #{userId} AND type = #{type}")
    Long countByUser(@Param("userId") Long userId, @Param("type") Integer type);
}
